#ifndef THREADMANAGER_H
#define THREADMANAGER_H

#include <QObject>

#include "processthread.h"
#include "loaderthread.h"
#include "processthread.h"
#include "counterthread.h"

class ThreadManager : public QObject
{
    Q_OBJECT
public:
    ThreadManager(QObject *parent = nullptr);
    ~ThreadManager();

    void initSlots();

    // 设置图片文件夹的路径，并启动连续遍历图片的两个子线程
    void setPathAndStartThread(const QString& path);
    // 停止处理
    void stopProcessing();
    // 暂停处理
    void pauseProcessing();
    // 继续处理
    void keepProcessing();
    // 设置为主线程当前的图片索引
    void setCurrManualIndex(const int index);
    // 设置统计模式
    void setCountMode(int mode);
    // 设置上限值
    void setLimits(int totalLimit, int leftLimit, int rightLimit);
    // 设置手动状态
    void setManualMode(bool isManual);
    // 获取手动状态
    bool isManualMode() const;

signals:
    // 处理完成信号
    void imageProcessed(const ProcessResult& result);
    // 处理错误信号
    void processError(const QString& errorMessage);
    // 队列已满信号
    void queueFull();
    // 图片总数信号
    void totalCountUpdated(const int count);
    // 计数更新信号
    void countUpdated(const CountResult& result);
    // 超过上限信号
    void LimitExceeded();
    // 倒计时信号，只有连续遍历图片模式才会发送
    void startCountdown(int seconds);

    void regionReceived(int width, const vector<XVL::XVRegion> &regions);

private slots:
    // 队列满处理
    void onQueueFull();
    // 处理错误
    void onError(const QString& errorMessage);
    // 得到图片总数
    void onTotalCount(const int count);
    // 超过上限处理
    void onLimitExceeded();
    // 计数更新
    void onCountUpdated(const CountResult& result);
    // 图片和区域处理完成
    void onProcessedAndRegions(const ProcessResult& result, const vector<XVL::XVRegion>& regions, int width);

private:
    SafeQueue* queue_;                      // 安全队列
    LoaderThread* loaderThread_;            // 加载线程
    ProcessThread* processThread_;          // 处理线程
    CounterThread* counterThread_;          // 计数线程
    atomic<bool> isManualMode_ = false;     // 标记是否处于手动模式
};

#endif // THREADMANAGER_H
